package xmu.crms.dao;

import xmu.crms.entity.SeminarGroup;
import xmu.crms.entity.SeminarGroupMember;
import xmu.crms.entity.Topic;
import xmu.crms.exception.*;
import xmu.crms.service.SeminarGroupService;

import java.math.BigInteger;
import java.util.List;

/**
 * @author huhui
 */

public interface SeminarGroupDao {
    /**
     * 按seminarGroupId删除SeminarGroupMember信息.
     * <p>按seminarGroupId删除SeminarGroupMember信息<br>
     * @author zhouzhongjun
     * @param seminarGroupId 讨论课小组Id
     */
    void deleteSeminarGroupMemberBySeminarGroupId(BigInteger seminarGroupId);

    /**
     * 将学生加入讨论课小组.
     * <p>将用户加入指定的讨论课小组<br>
     * @author YeHongjie
     * @param userId 学生的id
     * @param groupId 要加入讨论课小组的id
     * @return BigInteger 若创建成功返回该条记录的id，失败则返回-1
     *@throws  IllegalArgumentException (信息不合法，id格式错误)
     *@throws GroupNotFoundException (未找到小组)
     *@throws UserNotFoundException (不存在该学生)
     *@throws InvalidOperationException （待添加学生已经在小组里了）
     */
    BigInteger insertSeminarGroupMemberById(BigInteger userId, BigInteger groupId)
            throws IllegalArgumentException,GroupNotFoundException,UserNotFoundException,
            InvalidOperationException;

    /**
     * 查询讨论课小组成员.
     * <p>按照讨论课小组id查询该小组的成员<br>
     * @author YeHongjie
     * @param groupId 要查询的讨论课小组id
     * @return List 讨论课小组成员信息
     * @throws IllegalArgumentException 信息不合法，id格式错误
     * @throws GroupNotFoundException 未找到小组
     */
    List<SeminarGroupMember> listSeminarGroupMemberByGroupId(BigInteger groupId) throws
            IllegalArgumentException,GroupNotFoundException;

    /**
     * 获取某学生所有的讨论课小组.
     * <p>根据学生id获取学生所在的所有讨论课小组的信息<br>
     * @author qinlingyun
     * @param userId 学生id
     * @return list 讨论课小组列表
     * @throws IllegalArgumentException 信息不合法，id格式错误
     */
    List<SeminarGroup> listSeminarGroupIdByStudentId(BigInteger userId) throws
            IllegalArgumentException;


    /**
     * 查询讨论课小组队长id.
     * <p>按照讨论课小组id查询该小组的队长id<br>
     * @author YeHongjie
     * @param groupId 要查询的讨论课小组id
     * @return leaderId 讨论课小组队长id
     * @throws IllegalArgumentException 信息不合法，id格式错误
     * @throws GroupNotFoundException 未找到小组
     */
    BigInteger getSeminarGroupLeaderByGroupId(BigInteger groupId) throws
            IllegalArgumentException,GroupNotFoundException;


    /**
     * 按seminarId获取SeminarGroup.
     * <p>按seminarId获取SeminarGroup<br>
     * @author zhouzhongjun
     * @param seminarId 课程Id
     * @return 讨论课小组列表
     * @throws IllegalArgumentException 信息不合法，id格式错误
     * @throws SeminarNotFoundException 未找到讨论课
     */
    List<SeminarGroup> listSeminarGroupBySeminarId(BigInteger seminarId) throws
            IllegalArgumentException,SeminarNotFoundException;

    /**
     * 按seminarId删除讨论课小组信息.
     * <p>根据seminarId获得SeminarGroup，然后根据SeminarGroupId删除SeminarGroupMember信息，最后再删除SeminarGroup信息<br>
     * @author zhouzhongjun
     * @param seminarId 讨论课Id
     * @see SeminarGroupService #listSeminarGroupBySeminarId(BigInteger seminarId)
     * @see SeminarGroupService #deleteSeminarGroupMemberBySeminarGroupId(BigInteger seminarGroupId)
     * @throws IllegalArgumentException 信息不合法，id格式错误
     */
    void deleteSeminarGroupBySeminarId(BigInteger seminarId) throws
            IllegalArgumentException;


    /**
     * 创建讨论课小组.
     * <p>在指定讨论课下创建讨论课小组<br>
     * @param seminarId
     * @param classId
     * @param seminarGroup
     * @return BigInteger 若创建成功返回该小组的id，失败则返回-1
     * @throws IllegalArgumentException 信息不合法，id格式错误
     */
    BigInteger insertSeminarGroupBySeminarId(BigInteger seminarId, BigInteger classId, SeminarGroup seminarGroup) throws IllegalArgumentException;

    /**
     * 创建小组成员信息.
     * <p>在指定小组成员表下创建一个新的小组信息<br>
     * @param seminarGroupMember 小组成员信息
     * @param groupId 小组id
     * @return BigInteger 若创建成功返回该小组成员表的id，失败则返回-1
     */
    BigInteger insertSeminarGroupMemberByGroupId(BigInteger groupId, SeminarGroupMember seminarGroupMember);


    /**
     * 删除讨论课小组.
     * <p>按照id删除讨论课小组<br>
     * @author YeHongjie
     * @param seminarGroupId 讨论课小组的id
     * @see SeminarGroupService #deleteSeminarGroupMemberBySeminarGroupId(BigInteger seminarGroupId)
     * @throws IllegalArgumentException 信息不合法，id格式错误
     */
    void deleteSeminarGroupByGroupId(BigInteger seminarGroupId) throws
            IllegalArgumentException;


    /**
     * 查询讨论课小组.
     * <p>按照id查询某一讨论课小组的信息（包括成员）<br>
     * @author YeHongjie
     * @param groupId 小组的id
     * @return seminarGroup 讨论课小组对象，若未找到相关小组返回空(null)
     * @see SeminarGroupService #listSeminarGroupMemberByGroupId(BigInteger groupId)
     * @throws IllegalArgumentException (信息不合法，id格式错误)
     * @throws GroupNotFoundException (未找到小组)
     */
    SeminarGroup getSeminarGroupByGroupId(BigInteger groupId) throws
            IllegalArgumentException,GroupNotFoundException;

    /**
     * 根据讨论课Id及用户id，获得该用户所在的讨论课的小组的信息.
     * <p>根据讨论课Id及用户id，获得该用户所在的讨论课的小组的信息<br>
     * @param seminarId 讨论课的id
     * @param userId 用户的id
     * @return SeminarGroup Group的相关信息
     * @throws IllegalArgumentException 信息不合法，id格式错误
     * @throws GroupNotFoundException 未找到小组
     */
    SeminarGroup getSeminarGroupById(BigInteger seminarId, BigInteger userId) throws
            IllegalArgumentException,GroupNotFoundException;


    /**
     * 根据话题Id获得选择该话题的所有小组的信息.
     * <p>根据话题Id获得选择该话题的所有小组的信息<br>
     * @param  topicId 话题的id
     * @return List 所有选择该话题的所有group的信息
     * @throws IllegalArgumentException 信息不合法，id格式错误
     * @throws GroupNotFoundException 未找到小组
     */
    List<SeminarGroup> listGroupByTopicId(BigInteger topicId) throws
            IllegalArgumentException;

    /**
     * 小组按id选择话题.
     * <p>小组通过小组id和话题id选择讨论课的话题<br>
     * @author heqi
     * @param groupId 小组id
     * @param topicId 话题id
     * @return BigInteger 返回seminarGroupTopicId
     * @throws IllegalArgumentException GroupId、TopicId格式错误时抛出
     * @throws GroupNotFoundException 该小组不存在时抛出
     */
    BigInteger insertTopicByGroupId(BigInteger groupId, BigInteger topicId) throws
            IllegalArgumentException,GroupNotFoundException;


    /**
     * 成为组长.
     * <p>同学按小组id和自身id成为组长<br>
     * @param groupId 小组id
     * @param userId  学生id
     * @throws IllegalArgumentException 信息不合法，id格式错误
     * @throws GroupNotFoundException 未找到小组
     * @throws UserNotFoundException 不存在该学生
     * @throws InvalidOperationException 已经有组长了
     */
    void updateSeminarGroupById(BigInteger groupId, BigInteger userId) throws
            IllegalArgumentException, UserNotFoundException, GroupNotFoundException, InvalidOperationException;
    /**
     * 组长辞职.
     * <p>同学按小组id和自身id成为组长<br>
     * @param groupId 小组id
     * @param userId  学生id
     * @throws IllegalArgumentException 信息不合法，id格式错误
     * @throws GroupNotFoundException 未找到小组
     * @throws UserNotFoundException 不存在该学生
     * @throws InvalidOperationException 已经有组长了
     */
    void resignLeaderById(BigInteger groupId, BigInteger userId) throws
            IllegalArgumentException, UserNotFoundException, GroupNotFoundException, InvalidOperationException;
    /**
     * 新增获取未选择话题的小组方法.
     *
     * @param seminarId
     * @return List 未选择话题小组列表
     */
    List<SeminarGroup> listSeminarGroupNotHaveTopic(BigInteger seminarId);


    /**
     * 删除小组成员.
     * @param seminarGroupId
     * @param userId
     */
    void deleteSeminarGroupMemberById(BigInteger seminarGroupId, BigInteger userId);

    /**
     * 上传报告
     * @param seminarGroup seminarGroup信息
     *
     */
    void uploadReport(SeminarGroup seminarGroup);
}
